package org.tri.model;

import java.util.List;
import javax.swing.table.AbstractTableModel;
import org.tri.entity.Animal;

/**
 * La clase {@code AnimalesListTableModel} es un modelo específico para llenar
 * una tabla de animales, la cual a diferencia de una tabla normal, funciona
 * como una lista multicolumna.
 * @author kiira
 * @version 1.0, Apr 7, 2012
 */
public class AnimalesListTableModel extends AbstractTableModel {
    /** Animales del modelo. */
    private List<Animal> animales;
    /** Cantidad de columnas que se quiere poner en el modelo. */
    private int columns;

    /**
     * Inicializa el modelo indicando los animales a mostrar y la cantidad de
     * columnas a utilizar.
     * @param animales animales del modelo.
     * @param columns columnas del modelo.
     */
    public AnimalesListTableModel( List<Animal> animales, int columns ) {
        this.animales = animales;
        this.columns = columns;
        
    }//end constructor

    /**
     * Inicializa el modelo sin animales.
     * @param columns columnas del modelo.
     */
    public AnimalesListTableModel( int columns ) {
        this.columns = columns;
    
    }//end constructor   
        
    /**
     * {@inheritDoc}     
     */
    @Override
    public int getRowCount() {
        int rows = 0;
        if ( animales != null )
            rows = (int)Math.ceil( (double)animales.size() / columns );
        
        return rows;
        
    }//end método getRowCount

    /**
     * {@inheritDoc}     
     */
    @Override
    public int getColumnCount() {
        return columns;
        
    }//end método getColumnCount

    /**
     * {@inheritDoc}     
     */
    @Override
    public Object getValueAt( int rowIndex, int columnIndex ) {
        Object res = null;
       
        if ( animales != null && rowIndex < getRowCount() && rowIndex >= 0
             && columnIndex < columns && columnIndex >= 0 ) {
            int animalIndex = rowIndex * columns + columnIndex;
            
            if ( animalIndex < animales.size() )
                res = animales.get( animalIndex );
            
        }//end if
        
        return res;
        
    }//end método getValueAt
    
    /**
     * Permite asignar los animales que usa el modelo para feedear la tabla.
     * @param animales animales del modelo.
     */
    public void setAnimales( List<Animal> animales ) {
        this.animales = animales;
        
        this.fireTableDataChanged();
        
    }//end método setAnimales

}//end clase AnimalesListTableModel
